Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.07.2012, 09:54
Интересующийся
Отправить личное сообщение для Stanisov Посмотреть профиль Найти все сообщения от Stanisov
 
Регистрация: 03.01.2012
Сообщений: 17

AJAX + PHP загрузка файлов с сервера
Добрый день!
Много сейчас реализовано решений для AJAX загрузки файлов на сервер. Но чтобы скачать файл с сервера - информации нигде не встречал
Вообщем у меня есть рабочий вариант реализации AJAX , но файл он не скачивает а отображает его содержимое в консоле как txt.

Файл ajax.js
$(function() // объявляем глобальную функцию готовности DOM
{
    $('button#getfile').live('click', function() // Выкачиваем AJAX'ом сгенерированный CSV файл
    {
        $.get('/?getfile', function(){}); // коннектим к AJAX обработчику
    });
});


Файл обработчик getfile.php
<?php 
if($core->isAjax() && isset($_REQUEST['getfile'])) // если AJAX верный
{
	$core->getFILE(); // генерируем файл
	$core->getCSV(); // выдаем CSV в браузер моментально
}?>


Методы вызываемые выше - core.class.php
<?php
public function getCSV() // метод для загрузки CSV
	{
		$filename = SITEROOT."data-".date('d-m-Y').".".FILEEXT;
		$filenameroot = PATHFILE."data-".date('d-m-Y').".".FILEEXT;
		header('Content-type: application/octet-stream');
		header('Content-Disposition: attachment; filename="'.$filename.'"');
		header('Content-Transfer-Encoding: binary');
		readfile($filename);
		unlink($filenameroot);
	}

	public function getFILE() // метод генерации исходящего файла
	{
		$sql = "SELECT cat.category_name AS category, sub.category_name AS subcategory
FROM `".DBPREFIX."_categories` cat
RIGHT JOIN ".DBPREFIX."_subcategories sub ON sub.category_id = cat.category_id INTO OUTFILE '".PATHFILE."data-".date('d-m-Y').".".FILEEXT."'";
		try
		{
			$this->db->query($sql);
		}
		catch(PDOException $e)
		{
			echo $e->getMessage();
			return false;
		}
	}?>


Как видно выше, файл получаю в бинарном режиме. В браузере заголовок ответа выглядит следующим образом:
Код:
Connection	Keep-Alive
Content-Disposition	attachment; filename="http://www.vertical.local/data/data-06-07-2012.csv"
Content-Length	3392
Content-Type	application/octet-stream
Date	Fri, 06 Jul 2012 05:48:14 GMT
Keep-Alive	timeout=5, max=100
Server	Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By	PHP/5.3.8
content-transfer-encoding	binary
Ответить с цитированием
  #2 (permalink)  
Старый 06.07.2012, 10:04
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от Stanisov
Но чтобы скачать файл с сервера - информации нигде не встречал
А как по вашему скачиваются файлы(картинки.музыка,доку енты..) на комп -с серверов?

Для работы с файлом на клиенте с помощью js -вы получаете не файл ,а
информацию из файла и работаете с ней-везде описано . И дальше- флаг вам в руки файл апи или сохраняйте на сервер изменённую

Последний раз редактировалось dmitriymar, 06.07.2012 в 10:07.
Ответить с цитированием
  #3 (permalink)  
Старый 06.07.2012, 10:18
Интересующийся
Отправить личное сообщение для Stanisov Посмотреть профиль Найти все сообщения от Stanisov
 
Регистрация: 03.01.2012
Сообщений: 17

Я получил в ответе не информацию о файле , а его содержимое, в правильной и вполне читаемой кодировке, даже по строкам отформатированное. Но мне нужно отдать его в браузер как загружаемый от Сервера. Как мне это сделать? на чистом PHP это работает, а JS - нет.
А что это за файл API? Расскажите, пожалуйста где это найти?
Ответить с цитированием
  #4 (permalink)  
Старый 06.07.2012, 12:00
Интересующийся
Отправить личное сообщение для Stanisov Посмотреть профиль Найти все сообщения от Stanisov
 
Регистрация: 03.01.2012
Сообщений: 17

Что, нет больше вариантов? =((
Ответить с цитированием
  #5 (permalink)  
Старый 06.07.2012, 13:10
Аватар для Serg_pnz
Сам по себе
Отправить личное сообщение для Serg_pnz Посмотреть профиль Найти все сообщения от Serg_pnz
 
Регистрация: 09.06.2009
Сообщений: 963

Может что-то пригодится:

1. Для .htaccess
<files *.pdf> 
forceType application/octet-stream 
Header set Content-Disposition attachment 
</files>


2. На php
header('Content-type: application/octet-stream');
header("Content-Disposition: attachment; filename=".$_GET['url']); 
$x = fread(fopen($_GET['url'], "rb"), filesize($_GET['url'])); 
echo $x;
Ответить с цитированием
  #6 (permalink)  
Старый 06.07.2012, 15:00
Интересующийся
Отправить личное сообщение для Stanisov Посмотреть профиль Найти все сообщения от Stanisov
 
Регистрация: 03.01.2012
Сообщений: 17

Сообщение от Serg_pnz Посмотреть сообщение
Может что-то пригодится:

1. Для .htaccess
<files *.pdf> 
forceType application/octet-stream 
Header set Content-Disposition attachment 
</files>


2. На php
header('Content-type: application/octet-stream');
header("Content-Disposition: attachment; filename=".$_GET['url']); 
$x = fread(fopen($_GET['url'], "rb"), filesize($_GET['url'])); 
echo $x;
Ничего не получилось вот скрины ответа (


Ответить с цитированием
  #7 (permalink)  
Старый 06.07.2012, 16:15
Аватар для Serg_pnz
Сам по себе
Отправить личное сообщение для Serg_pnz Посмотреть профиль Найти все сообщения от Serg_pnz
 
Регистрация: 09.06.2009
Сообщений: 963

Давай выясним зачем это надо, почему не отдавать прямую ссылку на файл?
Ответить с цитированием
  #8 (permalink)  
Старый 06.07.2012, 17:50
Интересующийся
Отправить личное сообщение для Stanisov Посмотреть профиль Найти все сообщения от Stanisov
 
Регистрация: 03.01.2012
Сообщений: 17

Да возможно, это запросто, но тогда не нужен AJAX
а в этом моменте работа через него, так как кнопка появляется перед созданием файла и после основной разметке на странице (использую live)
Ответить с цитированием
  #9 (permalink)  
Старый 06.07.2012, 18:58
Аватар для Serg_pnz
Сам по себе
Отправить личное сообщение для Serg_pnz Посмотреть профиль Найти все сообщения от Serg_pnz
 
Регистрация: 09.06.2009
Сообщений: 963

А если создавать файл аяксом, а потом по callback отдавать прямую ссылку на него?
Ответить с цитированием
  #10 (permalink)  
Старый 07.07.2012, 11:16
Интересующийся
Отправить личное сообщение для Stanisov Посмотреть профиль Найти все сообщения от Stanisov
 
Регистрация: 03.01.2012
Сообщений: 17

Так оно и есть, у меня AJAX при обращении к PHP создает файл, где можно callback передать?
$(function() // объявляем глобальную функцию готовности DOM
{
	    $('button#getfile').live('click', function() // Выкачиваем AJAX'ом сгенерированный CSV файл
	    {
	        $.get('/?getfile', function(){}); // коннектим к AJAX обработчику
	    });
});



<?php 
if($core->isAjax() && isset($_REQUEST['getfile'])) // если AJAX верный
{
	$core->getFILE(); // генерируем файл (СДЕСЬ просто создается файл на сервере)
	$core->getCSV(); // выдаем CSV в браузер моментально (СДЕСЬ формируются на него заголовки выдачи в браузер)
}?>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Загрузка БОЛЬШИХ файлов посредством ajax barcelona jQuery 7 12.10.2012 03:37
Загрузка файлов (ajax jquery) q13m jQuery 3 08.03.2012 19:18
php session а в ajax Sadist_dead AJAX и COMET 1 19.08.2011 18:35
загрузка файла по принципу ajax neadekvat Общие вопросы Javascript 2 12.05.2009 22:23